package tom.vertx.core.demo02;

import io.vertx.core.DeploymentOptions;
import io.vertx.core.Vertx;
import io.vertx.core.VertxOptions;
import io.vertx.core.eventbus.EventBusOptions;
import io.vertx.spi.cluster.zookeeper.ZookeeperClusterManager;
import lombok.extern.slf4j.Slf4j;

/**
 * 通过event bus在不同verticle间传递数据
 * @author ZHUFEIFEI
 */
@Slf4j
public class EventBusDemo {

   static class C {
     /**
      * 使用zk manager, 集群内event bus通信, 注意: 每个verticle如果存在某个handler阻塞,将会影响其他handler执行
      *
      * event bus支持通过ssl加密,需设置keyStore trustStore, 一旦启用ssl, 则ClusterManager也必须启用ssl, 参考文档
      * @param args
      */
     public static void main(String[] args) {
       Vertx.clusteredVertx(
         new VertxOptions().setClusterManager(new ZookeeperClusterManager())
           //集群环境下，启用-ha，在相同ha group下的节点vertx出现失败时，会转移到同组的其他节点启动运行
           .setHAGroup("ha-event2").setHAEnabled(true)
           //event bus as cluster, 监听host port取默认,host: localhost, port随机.  logActivity打印通信日志, LoggerHandler需要配置debug级别
           .setEventBusOptions(new EventBusOptions().setClustered(true).setLogActivity(false))
           //ha高可用最少节点数配置，默认1，当启用ha时，集群中最少要有quorum个节点集群才会正常启动，否则集群不会运行部署vertx直到可用节点数达到quorum数，用于防止网络分区(脑裂)
           .setQuorumSize(1),
         res -> {
           if (res.succeeded()) {
             res.result().deployVerticle(new MyVerticle01());
             log.info("cluster vertx succeeded.");
           } else {
             res.cause().printStackTrace();
           }
         }
       );
     }
   }

    static class S {
      public static void main(String[] args) {
        Vertx.clusteredVertx(
          new VertxOptions().setClusterManager(new ZookeeperClusterManager())
            .setHAGroup("ha-event").setHAEnabled(true)
            .setQuorumSize(1)
            //event bus as cluster, 监听host port取默认
            .setEventBusOptions(new EventBusOptions().setClustered(true).setLogActivity(false)),
          res -> {
            if (res.succeeded()) {
              //部署启动1个实例
              res.result().deployVerticle(new MyVerticle02(), new DeploymentOptions().setInstances(1));
              log.info("cluster vertx succeeded.");
            } else {
              res.cause().printStackTrace();
            }
          }
        );
      }
    }


  /**
   * 同一个vertx实例内的event bus
   * @param args
   */
  public static void main1(String[] args) {
    Vertx vertx = Vertx.vertx();
    vertx.deployVerticle(new MyVerticle02());
    vertx.deployVerticle(new MyVerticle01());
  }
}
